/*
 * (C) 2023 see Authors.txt
 *
 * This file is part of MPC-BE.
 *
 * MPC-BE is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * MPC-BE is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#include "stdafx.h"
#include "ISOLang.h"
#include "DSUtil.h"
#include "text.h"

static struct {
	LPCSTR name, iso6392, iso6391;
	LCID lcid;
} s_isolangs[] = { // TODO : fill LCID !!!
	// http://www.loc.gov/standards/iso639-2/php/code_list.php
	// http://www.loc.gov/standards/iso639-2/php/English_list.php
	// http://www.opensubtitles.org/addons/export_languages.php

	{"Abkhazian",                   "abk", "ab"},
	{"Achinese",                    "ace", ""},
	{"Acoli",                       "ach", ""},
	{"Adangme",                     "ada", ""},
	{"Adyghe",                      "ady", ""},
	{"Afar",                        "aar", "aa"},
	{"Afrihili",                    "afh", ""},
	{"Afrikaans",                   "afr", "af", MAKELCID( MAKELANGID(LANG_AFRIKAANS, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Afro-Asiatic (Other)",        "afa", ""},
	{"Akan",                        "aka", "ak"},
	{"Akkadian",                    "akk", ""},
	{"Albanian",                    "alb", "sq"},
	{"Albanian",                    "sqi", "sq", MAKELCID( MAKELANGID(LANG_ALBANIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Aleut",                       "ale", ""},
	{"Algonquian languages",        "alg", ""},
	{"Altaic (Other)",              "tut", ""},
	{"Amharic",                     "amh", "am"},
	{"Apache languages",            "apa", ""},
	{"Arabic",                      "ara", "ar", MAKELCID( MAKELANGID(LANG_ARABIC, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Aragonese",                   "arg", "an"},
	{"Aramaic",                     "arc", ""},
	{"Arapaho",                     "arp", ""},
	{"Araucanian",                  "arn", ""},
	{"Arawak",                      "arw", ""},
	{"Armenian",                    "arm", "hy", MAKELCID( MAKELANGID(LANG_ARMENIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Armenian",                    "hye", "hy", MAKELCID( MAKELANGID(LANG_ARMENIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Artificial (Other)",          "art", ""},
	{"Assamese",                    "asm", "as", MAKELCID( MAKELANGID(LANG_ASSAMESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Asturian; Bable",             "ast", "at"},
	{"Athapascan languages",        "ath", ""},
	{"Australian languages",        "aus", ""},
	{"Austronesian (Other)",        "map", ""},
	{"Avaric",                      "ava", "av"},
	{"Avestan",                     "ave", "ae"},
	{"Awadhi",                      "awa", ""},
	{"Aymara",                      "aym", "ay"},
	{"Azerbaijani",                 "aze", "az", MAKELCID( MAKELANGID(LANG_AZERI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Bable; Asturian",             "ast", ""},
	{"Balinese",                    "ban", ""},
	{"Baltic (Other)",              "bat", ""},
	{"Baluchi",                     "bal", ""},
	{"Bambara",                     "bam", "bm"},
	{"Bamileke languages",          "bai", ""},
	{"Banda",                       "bad", ""},
	{"Bantu (Other)",               "bnt", ""},
	{"Basa",                        "bas", ""},
	{"Bashkir",                     "bak", "ba", MAKELCID( MAKELANGID(LANG_BASHKIR, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Basque",                      "baq", "eu", MAKELCID( MAKELANGID(LANG_BASQUE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Basque",                      "eus", "eu", MAKELCID( MAKELANGID(LANG_BASQUE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Batak (Indonesia)",           "btk", ""},
	{"Beja",                        "bej", ""},
	{"Belarusian",                  "bel", "be", MAKELCID( MAKELANGID(LANG_BELARUSIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Bemba",                       "bem", ""},
	{"Bengali",                     "ben", "bn", MAKELCID( MAKELANGID(LANG_BENGALI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Berber (Other)",              "ber", ""},
	{"Bhojpuri",                    "bho", ""},
	{"Bihari",                      "bih", "bh"},
	{"Bikol",                       "bik", ""},
	{"Bini",                        "bin", ""},
	{"Bislama",                     "bis", "bi"},
	{"Blin",                        "byn", ""},
	{"Norwegian Bokmal",            "nob", "nb"},
	{"Bosnian",                     "bos", "bs"},
	{"Braj",                        "bra", ""},
	// unofficial codes for Brazilian Portuguese language
	{"Portuguese (BR)",             "pob", "pb", MAKELCID(MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), SORT_DEFAULT) },
	{"Breton",                      "bre", "br", MAKELCID( MAKELANGID(LANG_BRETON, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Buginese",                    "bug", ""},
	{"Bulgarian",                   "bul", "bg", MAKELCID( MAKELANGID(LANG_BULGARIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Buriat",                      "bua", ""},
	{"Burmese",                     "bur", "my"},
	{"Burmese",                     "mya", "my"},
	{"Caddo",                       "cad", ""},
	{"Carib",                       "car", ""},
	{"Spanish; Castilian",          "spa", "es", MAKELCID( MAKELANGID(LANG_SPANISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Catalan",                     "cat", "ca", MAKELCID( MAKELANGID(LANG_CATALAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Caucasian (Other)",           "cau", ""},
	{"Cebuano",                     "ceb", ""},
	{"Celtic (Other)",              "cel", ""},
	{"Central American Indian (Other)", "cai", ""},
	{"Chagatai",                    "chg", ""},
	{"Chamic languages",            "cmc", ""},
	{"Chamorro",                    "cha", "ch"},
	{"Chechen",                     "che", "ce"},
	{"Cherokee",                    "chr", ""},
	{"Chewa; Chichewa; Nyanja",     "nya", "ny"},
	{"Cheyenne",                    "chy", ""},
	{"Chibcha",                     "chb", ""},
	{"Chichewa; Chewa; Nyanja",     "nya", "ny"},
	{"Chinese (traditional)",       "zht", "zt", MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_DEFAULT)},
	{"Chinese bilingual",           "zhe", "ze"},
	{"Chinese",                     "chi", "zh", MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_NEUTRAL), SORT_DEFAULT)},
	{"Chinese",                     "zho", "zh", MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_NEUTRAL), SORT_DEFAULT)},
	{"Chinook jargon",              "chn", ""},
	{"Chipewyan",                   "chp", ""},
	{"Choctaw",                     "cho", ""},
	{"Chuang; Zhuang",              "zha", "za"},
	{"Church Slavic; Old Church Slavonic", "chu", "cu"},
	{"Old Church Slavonic; Old Slavonic; ", "chu", "cu"},
	{"Church Slavonic; Old Bulgarian; Church Slavic;", "chu", "cu"},
	{"Old Slavonic; Church Slavonic; Old Bulgarian;", "chu", "cu"},
	{"Church Slavic; Old Church Slavonic", "chu", "cu"},
	{"Chuukese",                    "chk", ""},
	{"Chuvash",                     "chv", "cv"},
	{"Classical Newari",            "nwc", ""},
	{"Coptic",                      "cop", ""},
	{"Cornish",                     "cor", "kw"},
	{"Corsican",                    "cos", "co", MAKELCID( MAKELANGID(LANG_CORSICAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Cree",                        "cre", "cr"},
	{"Creek",                       "mus", ""},
	{"Creoles and pidgins (Other)", "crp", ""},
	{"Creoles and pidgins, English-based (Other)", "cpe", ""},
	{"Creoles and pidgins, French-based (Other)", "cpf", ""},
	{"Creoles and pidgins, Portuguese-based (Other)", "cpp", ""},
	{"Crimean Turkish",             "crh", ""},
	{"Croatian",                    "scr", "hr", MAKELCID( MAKELANGID(LANG_CROATIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Croatian",                    "hrv", "hr", MAKELCID( MAKELANGID(LANG_CROATIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Cushitic (Other)",            "cus", ""},
	{"Czech",                       "cze", "cs", MAKELCID( MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Czech",                       "ces", "cs", MAKELCID( MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Dakota",                      "dak", ""},
	{"Danish",                      "dan", "da", MAKELCID( MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Dargwa",                      "dar", ""},
	{"Dayak",                       "day", ""},
	{"Delaware",                    "del", ""},
	{"Dinka",                       "din", ""},
	{"Divehi",                      "div", "dv", MAKELCID( MAKELANGID(LANG_DIVEHI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Dogri",                       "doi", ""},
	{"Dogrib",                      "dgr", ""},
	{"Dravidian (Other)",           "dra", ""},
	{"Duala",                       "dua", ""},
	{"Dutch; Flemish",              "dut", "nl", MAKELCID( MAKELANGID(LANG_DUTCH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Dutch; Flemish",              "nld", "nl", MAKELCID( MAKELANGID(LANG_DUTCH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Dutch, Middle (ca. 1050-1350)", "dum", ""},
	{"Dyula",                       "dyu", ""},
	{"Dzongkha",                    "dzo", "dz"},
	{"Efik",                        "efi", ""},
	{"Egyptian (Ancient)",          "egy", ""},
	{"Ekajuk",                      "eka", ""},
	{"Elamite",                     "elx", ""},
	{"English",                     "eng", "en", MAKELCID( MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"English, Middle (1100-1500)", "enm", ""},
	{"English, Old (ca.450-1100)",  "ang", ""},
	{"Erzya",                       "myv", ""},
	{"Extremaduran",                "ext", "ex"},
	{"Esperanto",                   "epo", "eo"},
	{"Estonian",                    "est", "et",MAKELCID( MAKELANGID(LANG_ESTONIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Ewe",                         "ewe", "ee"},
	{"Ewondo",                      "ewo", ""},
	{"Fang",                        "fan", ""},
	{"Fanti",                       "fat", ""},
	{"Faroese",                     "fao", "fo", MAKELCID( MAKELANGID(LANG_FAEROESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Fijian",                      "fij", "fj"},
	{"Finnish",                     "fin", "fi", MAKELCID( MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Finno-Ugrian (Other)",        "fiu", ""},
	{"Flemish; Dutch",              "dut", "nl"},
	{"Flemish; Dutch",              "nld", "nl"},
	{"Fon",                         "fon", ""},
	{"French",                      "fre", "fr", MAKELCID( MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"French",                      "fra", "fr", MAKELCID( MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"French, Middle (ca.1400-1600)", "frm", ""},
	{"French, Old (842-ca.1400)",   "fro", ""},
	{"Frisian",                     "fry", "fy", MAKELCID( MAKELANGID(LANG_FRISIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Friulian",                    "fur", ""},
	{"Fulah",                       "ful", "ff"},
	{"Ga",                          "gaa", ""},
	{"Gaelic; Scottish Gaelic",     "gla", "gd", MAKELCID( MAKELANGID(LANG_GALICIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Galician",                    "glg", "gl"},
	{"Ganda",                       "lug", "lg"},
	{"Gayo",                        "gay", ""},
	{"Gbaya",                       "gba", ""},
	{"Geez",                        "gez", ""},
	{"Georgian",                    "geo", "ka", MAKELCID( MAKELANGID(LANG_GEORGIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Georgian",                    "kat", "ka", MAKELCID( MAKELANGID(LANG_GEORGIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"German",                      "ger", "de", MAKELCID( MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"German",                      "deu", "de", MAKELCID( MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"German, Low; Saxon, Low; Low German; Low Saxon", "nds", ""},
	{"German, Middle High (ca.1050-1500)", "gmh", ""},
	{"German, Old High (ca.750-1050)", "goh", ""},
	{"Germanic (Other)",            "gem", ""},
	{"Gikuyu; Kikuyu",              "kik", "ki"},
	{"Gilbertese",                  "gil", ""},
	{"Gondi",                       "gon", ""},
	{"Gorontalo",                   "gor", ""},
	{"Gothic",                      "got", ""},
	{"Grebo",                       "grb", ""},
	{"Greek, Ancient (to 1453)",    "grc", "",   MAKELCID( MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Greek, Modern (1453-)",       "gre", "el", MAKELCID( MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Greek, Modern (1453-)",       "ell", "el", MAKELCID( MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Greenlandic; Kalaallisut",    "kal", "kl", MAKELCID( MAKELANGID(LANG_GREENLANDIC, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Guarani",                     "grn", "gn"},
	{"Gujarati",                    "guj", "gu", MAKELCID( MAKELANGID(LANG_GUJARATI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Gwich’in",                    "gwi", ""},
	{"Haida",                       "hai", ""},
	{"Haitian",                     "hat", "ht"},
	{"Hausa",                       "hau", "ha", MAKELCID( MAKELANGID(LANG_HAUSA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Hawaiian",                    "haw", ""},
	{"Hebrew",                      "heb", "he", MAKELCID( MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Herero",                      "her", "hz"},
	{"Hiligaynon",                  "hil", ""},
	{"Himachali",                   "him", ""},
	{"Hindi",                       "hin", "hi", MAKELCID( MAKELANGID(LANG_HINDI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Hiri Motu",                   "hmo", "ho"},
	{"Hittite",                     "hit", ""},
	{"Hmong",                       "hmn", ""},
	{"Hungarian",                   "hun", "hu", MAKELCID( MAKELANGID(LANG_HUNGARIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Hupa",                        "hup", ""},
	{"Iban",                        "iba", ""},
	{"Icelandic",                   "ice", "is", MAKELCID( MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Icelandic",                   "isl", "is", MAKELCID( MAKELANGID(LANG_ICELANDIC, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Ido",                         "ido", "io"},
	{"Igbo",                        "ibo", "ig", MAKELCID( MAKELANGID(LANG_IGBO, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Ijo",                         "ijo", ""},
	{"Iloko",                       "ilo", ""},
	{"Inari Sami",                  "smn", ""},
	{"Indic (Other)",               "inc", ""},
	{"Indo-European (Other)",       "ine", ""},
	{"Indonesian",                  "ind", "id", MAKELCID( MAKELANGID(LANG_INDONESIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Ingush",                      "inh", ""},
	{"Interlingua",                 "ina", "ia"},
	{"Interlingue",                 "ile", "ie"},
	{"Inuktitut",                   "iku", "iu", MAKELCID( MAKELANGID(LANG_INUKTITUT, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Inupiaq",                     "ipk", "ik"},
	{"Iranian (Other)",             "ira", ""},
	{"Irish",                       "gle", "ga", MAKELCID( MAKELANGID(LANG_IRISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Irish, Middle (900-1200)",    "mga", "",   MAKELCID( MAKELANGID(LANG_IRISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Irish, Old (to 900)",         "sga", "",   MAKELCID( MAKELANGID(LANG_IRISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Iroquoian languages",         "iro", ""},
	{"Italian",                     "ita", "it", MAKELCID( MAKELANGID(LANG_ITALIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Japanese",                    "jpn", "ja", MAKELCID( MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Javanese",                    "jav", "jv"},
	{"Judeo-Arabic",                "jrb", ""},
	{"Judeo-Persian",               "jpr", ""},
	{"Kabardian",                   "kbd", ""},
	{"Kabyle",                      "kab", ""},
	{"Kachin",                      "kac", ""},
	{"Kalaallisut; Greenlandic",    "kal", "kl"},
	{"Kalmyk",                      "xal", ""},
	{"Kamba",                       "kam", ""},
	{"Kannada",                     "kan", "kn", MAKELCID( MAKELANGID(LANG_KANNADA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Kanuri",                      "kau", "kr"},
	{"Kara-Kalpak",                 "kaa", ""},
	{"Karachay-Balkar",             "krc", ""},
	{"Karen",                       "kar", ""},
	{"Kashmiri",                    "kas", "ks", MAKELCID( MAKELANGID(LANG_KASHMIRI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Kashubian",                   "csb", ""},
	{"Kawi",                        "kaw", ""},
	{"Kazakh",                      "kaz", "kk", MAKELCID( MAKELANGID(LANG_KAZAK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Khasi",                       "kha", ""},
	{"Khmer",                       "khm", "km", MAKELCID( MAKELANGID(LANG_KHMER, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Khoisan (Other)",             "khi", ""},
	{"Khotanese",                   "kho", ""},
	{"Kikuyu; Gikuyu",              "kik", "ki"},
	{"Kimbundu",                    "kmb", ""},
	{"Kinyarwanda",                 "kin", "rw", MAKELCID( MAKELANGID(LANG_KINYARWANDA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Kirghiz",                     "kir", "ky"},
	{"Klingon",                     "tlh", ""},
	{"Komi",                        "kom", "kv"},
	{"Kongo",                       "kon", "kg"},
	{"Konkani",                     "kok", "",   MAKELCID( MAKELANGID(LANG_KONKANI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Korean",                      "kor", "ko", MAKELCID( MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Kosraean",                    "kos", ""},
	{"Kpelle",                      "kpe", ""},
	{"Kru",                         "kro", ""},
	{"Kuanyama; Kwanyama",          "kua", "kj"},
	{"Kumyk",                       "kum", ""},
	{"Kurdish",                     "kur", "ku"},
	{"Kurukh",                      "kru", ""},
	{"Kutenai",                     "kut", ""},
	{"Kwanyama, Kuanyama",          "kua", "kj"},
	{"Ladino",                      "lad", ""},
	{"Lahnda",                      "lah", ""},
	{"Lamba",                       "lam", ""},
	{"Lao",                         "lao", "lo", MAKELCID( MAKELANGID(LANG_LAO, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Latin",                       "lat", "la"},
	{"Latvian",                     "lav", "lv", MAKELCID( MAKELANGID(LANG_LATVIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Letzeburgesch; Luxembourgish", "ltz", "lb"},
	{"Lezghian",                    "lez", ""},
	{"Limburgan; Limburger; Limburgish", "lim", "li"},
	{"Limburger; Limburgan; Limburgish;", "lim", "li"},
	{"Limburgish; Limburger; Limburgan", "lim", "li"},
	{"Lingala",                     "lin", "ln"},
	{"Lithuanian",                  "lit", "lt", MAKELCID( MAKELANGID(LANG_LITHUANIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Lojban",                      "jbo", ""},
	{"Low German; Low Saxon; German, Low; Saxon, Low", "nds", ""},
	{"Low Saxon; Low German; Saxon, Low; German, Low", "nds", ""},
	{"Lower Sorbian",               "dsb", ""},
	{"Lozi",                        "loz", ""},
	{"Luba-Katanga",                "lub", "lu"},
	{"Luba-Lulua",                  "lua", ""},
	{"Luiseno",                     "lui", ""},
	{"Lule Sami",                   "smj", ""},
	{"Lunda",                       "lun", ""},
	{"Luo (Kenya and Tanzania)",    "luo", ""},
	{"Lushai",                      "lus", ""},
	{"Luxembourgish",               "ltz", "lb", MAKELCID( MAKELANGID(LANG_LUXEMBOURGISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Macedonian",                  "mac", "mk", MAKELCID( MAKELANGID(LANG_MACEDONIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Macedonian",                  "mkd", "mk", MAKELCID( MAKELANGID(LANG_MACEDONIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Madurese",                    "mad", ""},
	{"Magahi",                      "mag", ""},
	{"Maithili",                    "mai", ""},
	{"Makasar",                     "mak", ""},
	{"Malagasy",                    "mlg", "mg"},
	{"Malay",                       "may", "ms", MAKELCID( MAKELANGID(LANG_MALAY, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Malay",                       "msa", "ms", MAKELCID( MAKELANGID(LANG_MALAY, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Malayalam",                   "mal", "ml", MAKELCID( MAKELANGID(LANG_MALAYALAM, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Maltese",                     "mlt", "mt", MAKELCID( MAKELANGID(LANG_MALTESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Manchu",                      "mnc", ""},
	{"Mandar",                      "mdr", ""},
	{"Mandingo",                    "man", ""},
	{"Manipuri",                    "mni", "ma", MAKELCID( MAKELANGID(LANG_MANIPURI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Manobo languages",            "mno", ""},
	{"Manx",                        "glv", "gv"},
	{"Maori",                       "mao", "mi", MAKELCID( MAKELANGID(LANG_MAORI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Maori",                       "mri", "mi", MAKELCID( MAKELANGID(LANG_MAORI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Marathi",                     "mar", "mr", MAKELCID( MAKELANGID(LANG_MARATHI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Mari",                        "chm", ""},
	{"Marshallese",                 "mah", "mh"},
	{"Marwari",                     "mwr", ""},
	{"Masai",                       "mas", ""},
	{"Mayan languages",             "myn", ""},
	{"Mende",                       "men", ""},
	{"Micmac",                      "mic", ""},
	{"Minangkabau",                 "min", ""},
	{"Miscellaneous languages",     "mis", ""},
	{"Mohawk",                      "moh", "",   MAKELCID( MAKELANGID(LANG_MOHAWK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Moksha",                      "mdf", ""},
	{"Moldavian",                   "mol", "mo"},
	{"Mon-Khmer (Other)",           "mkh", ""},
	{"Mongo",                       "lol", ""},
	{"Mongolian",                   "mon", "mn", MAKELCID( MAKELANGID(LANG_MONGOLIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Montenegrin",                 "mne", "me"},
	{"Mossi",                       "mos", ""},
	{"Multiple languages",          "mul", ""},
	{"Munda languages",             "mun", ""},
	{"Nahuatl",                     "nah", ""},
	{"Nauru",                       "nau", "na"},
	{"Navaho, Navajo",              "nav", "nv"},
	{"Navajo; Navaho",              "nav", "nv"},
	{"Ndebele, North",              "nde", "nd"},
	{"Ndebele, South",              "nbl", "nr"},
	{"Ndonga",                      "ndo", "ng"},
	{"Neapolitan",                  "nap", ""},
	{"Nepali",                      "nep", "ne", MAKELCID( MAKELANGID(LANG_NEPALI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Newari",                      "new", ""},
	{"Nias",                        "nia", ""},
	{"Niger-Kordofanian (Other)",   "nic", ""},
	{"Nilo-Saharan (Other)",        "ssa", ""},
	{"Niuean",                      "niu", ""},
	{"Nogai",                       "nog", ""},
	{"Norse, Old",                  "non", ""},
	{"North American Indian (Other)", "nai", ""},
	{"Northern Sami",               "sme", "se"},
	{"North Ndebele",               "nde", "nd"},
	{"Norwegian",                   "nor", "no", MAKELCID( MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Norwegian Bokmal; Bokmal, Norwegian", "nob", "nb", MAKELCID( MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Norwegian Nynorsk; Nynorsk, Norwegian", "nno", "nn", MAKELCID( MAKELANGID(LANG_NORWEGIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Nubian languages",            "nub", ""},
	{"Nyamwezi",                    "nym", ""},
	{"Nyanja; Chichewa; Chewa",     "nya", "ny"},
	{"Nyankole",                    "nyn", ""},
	{"Nynorsk, Norwegian; Norwegian Nynorsk", "nno", "nn"},
	{"Nyoro",                       "nyo", ""},
	{"Nzima",                       "nzi", ""},
	{"Occitan",                     "oci", "oc", MAKELCID( MAKELANGID(LANG_OCCITAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Ojibwa",                      "oji", "oj"},
	{"Old Bulgarian; Old Slavonic; Church Slavonic;", "chu", "cu"},
	{"Oriya",                       "ori", "or"},
	{"Oromo",                       "orm", "om"},
	{"Osage",                       "osa", ""},
	{"Ossetian; Ossetic",           "oss", "os"},
	{"Ossetic; Ossetian",           "oss", "os"},
	{"Otomian languages",           "oto", ""},
	{"Pahlavi",                     "pal", ""},
	{"Palauan",                     "pau", ""},
	{"Pali",                        "pli", "pi"},
	{"Pampanga",                    "pam", ""},
	{"Pangasinan",                  "pag", ""},
	{"Panjabi",                     "pan", "pa"},
	{"Papiamento",                  "pap", ""},
	{"Papuan (Other)",              "paa", ""},
	{"Persian",                     "per", "fa", MAKELCID( MAKELANGID(LANG_PERSIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Persian",                     "fas", "fa", MAKELCID( MAKELANGID(LANG_PERSIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Persian, Old (ca.600-400 B.C.)", "peo", ""},
	{"Philippine (Other)",          "phi", ""},
	{"Phoenician",                  "phn", ""},
	{"Pohnpeian",                   "pon", ""},
	{"Polish",                      "pol", "pl", MAKELCID( MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Portuguese",                  "por", "pt", MAKELCID( MAKELANGID(LANG_PORTUGUESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Portuguese (MZ)",             "pom", "pm"},
	{"Prakrit languages",           "pra", ""},
	{"Provenзal; Occitan (post 1500)", "oci", "oc"},
	{"Provenзal, Old (to 1500)",    "pro", ""},
	{"Pushto",                      "pus", "ps"},
	{"Quechua",                     "que", "qu", MAKELCID( MAKELANGID(LANG_QUECHUA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Raeto-Romance",               "roh", "rm"},
	{"Rajasthani",                  "raj", ""},
	{"Rapanui",                     "rap", ""},
	{"Rarotongan",                  "rar", ""},
	//{"Reserved for local use",    "qaa-qtz", ""},
	{"Romance (Other)",             "roa", ""},
	{"Romanian",                    "rum", "ro", MAKELCID( MAKELANGID(LANG_ROMANIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Romanian",                    "ron", "ro", MAKELCID( MAKELANGID(LANG_ROMANIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Romany",                      "rom", ""},
	{"Rundi",                       "run", "rn"},
	{"Russian",                     "rus", "ru", MAKELCID( MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Salishan languages",          "sal", ""},
	{"Samaritan Aramaic",           "sam", ""},
	{"Sami languages (Other)",      "smi", ""},
	{"Samoan",                      "smo", "sm"},
	{"Sandawe",                     "sad", ""},
	{"Sango",                       "sag", "sg"},
	{"Sanskrit",                    "san", "sa", MAKELCID( MAKELANGID(LANG_SANSKRIT, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Santali",                     "sat", ""},
	{"Sardinian",                   "srd", "sc"},
	{"Sasak",                       "sas", ""},
	{"Saxon, Low; German, Low; Low Saxon; Low German", "nds", ""},
	{"Scots",                       "sco", ""},
	{"Scottish Gaelic; Gaelic",     "gla", "gd"},
	{"Selkup",                      "sel", ""},
	{"Semitic (Other)",             "sem", ""},
	{"Serbian",                     "scc", "sr", MAKELCID( MAKELANGID(LANG_SERBIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Serbian",                     "srp", "sr", MAKELCID( MAKELANGID(LANG_SERBIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Serer",                       "srr", ""},
	{"Shan",                        "shn", ""},
	{"Shona",                       "sna", "sn"},
	{"Sichuan Yi",                  "iii", "ii"},
	{"Sidamo",                      "sid", ""},
	{"Sign languages",              "sgn", ""},
	{"Siksika",                     "bla", ""},
	{"Sindhi",                      "snd", "sd", MAKELCID( MAKELANGID(LANG_SINDHI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Sinhalese",                   "sin", "si", MAKELCID( MAKELANGID(LANG_SINHALESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Sino-Tibetan (Other)",        "sit", ""},
	{"Siouan languages",            "sio", ""},
	{"Skolt Sami",                  "sms", ""},
	{"Slave (Athapascan)",          "den", ""},
	{"Slavic (Other)",              "sla", ""},
	{"Slovak",                      "slo", "sk", MAKELCID( MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Slovak",                      "slk", "sk", MAKELCID( MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Slovenian",                   "slv", "sl", MAKELCID( MAKELANGID(LANG_SLOVENIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Sogdian",                     "sog", ""},
	{"Somali",                      "som", "so"},
	{"Songhai",                     "son", ""},
	{"Soninke",                     "snk", ""},
	{"Sorbian languages",           "wen", ""},
	{"Sotho, Northern",             "nso", "",   MAKELCID( MAKELANGID(LANG_SOTHO, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Sotho, Southern",             "sot", "st", MAKELCID( MAKELANGID(LANG_SOTHO, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"South American Indian (Other)", "sai", ""},
	{"Southern Sami",               "sma", ""},
	{"South Ndebele",               "nbl", "nr"},
	{"Spanish; Castilian",          "spa", "es", MAKELCID( MAKELANGID(LANG_SPANISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Sukuma",                      "suk", ""},
	{"Sumerian",                    "sux", ""},
	{"Sundanese",                   "sun", "su"},
	{"Susu",                        "sus", ""},
	{"Swahili",                     "swa", "sw", MAKELCID( MAKELANGID(LANG_SWAHILI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Swati",                       "ssw", "ss"},
	{"Swedish",                     "swe", "sv", MAKELCID( MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Syriac",                      "syr", "sy",   MAKELCID( MAKELANGID(LANG_SYRIAC, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tagalog",                     "tgl", "tl"},
	{"Tahitian",                    "tah", "ty"},
	{"Tai (Other)",                 "tai", ""},
	{"Tajik",                       "tgk", "tg", MAKELCID( MAKELANGID(LANG_TAJIK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tamashek",                    "tmh", ""},
	{"Tamil",                       "tam", "ta", MAKELCID( MAKELANGID(LANG_TAMIL, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tatar",                       "tat", "tt", MAKELCID( MAKELANGID(LANG_TATAR, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Telugu",                      "tel", "te", MAKELCID( MAKELANGID(LANG_TELUGU, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tereno",                      "ter", ""},
	{"Tetum",                       "tet", ""},
	{"Thai",                        "tha", "th", MAKELCID( MAKELANGID(LANG_THAI, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tibetan",                     "tib", "bo", MAKELCID( MAKELANGID(LANG_TIBETAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tibetan",                     "bod", "bo", MAKELCID( MAKELANGID(LANG_TIBETAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tigre",                       "tig", ""},
	{"Tigrinya",                    "tir", "ti", MAKELCID( MAKELANGID(LANG_TIGRIGNA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Timne",                       "tem", ""},
	{"Tiv",                         "tiv", ""},
	{"Tlingit",                     "tli", ""},
	{"Tok Pisin",                   "tpi", ""},
	{"Tokelau",                     "tkl", ""},
	{"Tonga (Nyasa)",               "tog", ""},
	{"Tonga (Tonga Islands)",       "ton", "to"},
	{"Tsimshian",                   "tsi", ""},
	{"Tsonga",                      "tso", "ts"},
	{"Tswana",                      "tsn", "tn", MAKELCID( MAKELANGID(LANG_TSWANA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tumbuka",                     "tum", ""},
	{"Tupi languages",              "tup", ""},
	{"Turkish",                     "tur", "tr", MAKELCID( MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Turkish, Ottoman (1500-1928)", "ota", "",  MAKELCID( MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Turkmen",                     "tuk", "tk", MAKELCID( MAKELANGID(LANG_TURKMEN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Tuvalu",                      "tvl", ""},
	{"Tuvinian",                    "tyv", ""},
	{"Twi",                         "twi", "tw"},
	{"Udmurt",                      "udm", ""},
	{"Ugaritic",                    "uga", ""},
	{"Uighur",                      "uig", "ug", MAKELCID( MAKELANGID(LANG_UIGHUR, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Ukrainian",                   "ukr", "uk", MAKELCID( MAKELANGID(LANG_UKRAINIAN, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Umbundu",                     "umb", ""},
	{/*"Undetermined"*/"",          "und", ""},
	{"Upper Sorbian",               "hsb", ""},
	{"Urdu",                        "urd", "ur", MAKELCID( MAKELANGID(LANG_URDU, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Uzbek",                       "uzb", "uz", MAKELCID( MAKELANGID(LANG_UZBEK, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Vai",                         "vai", ""},
	{"Venda",                       "ven", "ve"},
	{"Vietnamese",                  "vie", "vi", MAKELCID( MAKELANGID(LANG_VIETNAMESE, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Volapuk",                     "vol", "vo"},
	{"Votic",                       "vot", ""},
	{"Wakashan languages",          "wak", ""},
	{"Walamo",                      "wal", ""},
	{"Walloon",                     "wln", "wa"},
	{"Waray",                       "war", ""},
	{"Washo",                       "was", ""},
	{"Welsh",                       "wel", "cy", MAKELCID( MAKELANGID(LANG_WELSH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Welsh",                       "cym", "cy", MAKELCID( MAKELANGID(LANG_WELSH, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Wolof",                       "wol", "wo", MAKELCID( MAKELANGID(LANG_WOLOF, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Xhosa",                       "xho", "xh", MAKELCID( MAKELANGID(LANG_XHOSA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Yakut",                       "sah", "",   MAKELCID( MAKELANGID(LANG_YAKUT, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Yao",                         "yao", ""},
	{"Yapese",                      "yap", ""},
	{"Yiddish",                     "yid", "yi"},
	{"Yoruba",                      "yor", "yo", MAKELCID( MAKELANGID(LANG_YORUBA, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Yupik languages",             "ypk", ""},
	{"Zande",                       "znd", ""},
	{"Zapotec",                     "zap", ""},
	{"Zenaga",                      "zen", ""},
	{"Zhuang; Chuang",              "zha", "za"},
	{"Zulu",                        "zul", "zu", MAKELCID( MAKELANGID(LANG_ZULU, SUBLANG_DEFAULT), SORT_DEFAULT)},
	{"Zuni",                        "zun", ""},
	{"",                            "", ""},
	{"No subtitles",                "---", "", (LCID)LCID_NOSUBTITLES},
};

CString ISO6391ToLanguage(LPCSTR code)
{
	CHAR tmp[2+1];
	if (strncpy_s(tmp, code, 2) == 0 && tmp[0]) {
		_strlwr_s(tmp);
		for (const auto& isolang : s_isolangs) {
			if (!strcmp(isolang.iso6391, tmp)) {
				CStringA ret(isolang.name);
				int k = ret.Find(';');
				if (k > 0) {
					ret.Truncate(k);
				}
				return CString(ret);
			}
		}
	}
	return L"";
}

CString ISO6392ToLanguage(LPCSTR code)
{
	CHAR tmp[3+1];
	if (strncpy_s(tmp, code, 3) == 0 && tmp[0]) {
		_strlwr_s(tmp);
		for (const auto& isolang : s_isolangs) {
			if (!strcmp(isolang.iso6392, tmp)) {
				CStringA ret(isolang.name);
				int k = ret.Find(';');
				if (k > 0) {
					ret.Truncate(k);
				}
				return CString(ret);
			}
		}
	}
	return CString(code);
}

bool IsISO639Language(LPCSTR code)
{
	size_t len = strlen(code);
	if (!len) {
		return false;
	}
	len++;

	LPSTR tmp = DNew CHAR[len];
	strncpy_s(tmp, len, code, len);
	_strlwr_s(tmp, len);
	tmp[0] = (CHAR)toupper(tmp[0]);

	bool bFound = false;
	for (const auto& isolang : s_isolangs) {
		if (!strcmp(isolang.name, tmp)) {
			bFound = true;
			break;
		}
	}

	delete [] tmp;

	return bFound;
}

CString ISO639XToLanguage(LPCSTR code, bool bCheckForFullLangName /*= false*/)
{
	CString lang;

	switch (size_t nLen = strlen(code)) {
		case 2:
			lang = ISO6391ToLanguage(code);
			break;
		case 3:
			lang = ISO6392ToLanguage(code);
			if (lang == code) { // When it can't find a match, ISO6392ToLanguage returns the input string
				lang.Empty();
			}
			break;
		default:
			if (bCheckForFullLangName
					&& nLen > 3
					&& IsISO639Language(code)) {
				lang = code;
			}
	}

	return lang;
}

LCID ISO6391ToLcid(LPCSTR code)
{
	CHAR tmp[3+1];
	if (strncpy_s(tmp, code, 3) == 0 && tmp[0]) {
		_strlwr_s(tmp);
		for (const auto& isolang : s_isolangs) {
			if (!strcmp(isolang.iso6391, code)) {
				return isolang.lcid;
			}
		}
	}
	return 0;
}

LCID ISO6392ToLcid(LPCSTR code)
{
	CHAR tmp[3+1];
	if (strncpy_s(tmp, code, 3) == 0 && tmp[0]) {
		_strlwr_s(tmp);
		for (const auto& isolang : s_isolangs) {
			if (!strcmp(isolang.iso6392, tmp)) {
				return isolang.lcid;
			}
		}
	}
	return 0;
}

LPCSTR ISO6391To6392(LPCSTR code)
{
	CHAR tmp[2+1];
	if (strncpy_s(tmp, code, 2) == 0 && tmp[0]) {
		_strlwr_s(tmp);
		for (const auto& isolang : s_isolangs) {
			if (!strcmp(isolang.iso6391, tmp)) {
				return isolang.iso6392;
			}
		}
	}
	return "";
}

LPCSTR ISO6392To6391(LPCSTR code)
{
	CHAR tmp[3+1];
	if (strncpy_s(tmp, code, 3) == 0 && tmp[0]) {
		_strlwr_s(tmp);
		for (const auto& isolang : s_isolangs) {
			if (!strcmp(isolang.iso6392, tmp)) {
				return isolang.iso6391;
			}
		}
	}
	return "";
}

CString LanguageToISO6392(LPCWSTR lang)
{
	CString str = lang;
	str.MakeLower();
	for (const auto& isolang : s_isolangs) {
		std::list<CString> sl;
		Explode(CString(isolang.name), sl, L';');
		for (const auto& s : sl) {
			if (!str.CompareNoCase(s)) {
				return CString(isolang.iso6392);
			}
		}
	}
	return L"";
}

